//给定一个包含正整数、加(+)、减(-)、乘(*)、除(/)的算数表达式(括号除外)，计算其结果。 
//
// 表达式仅包含非负整数，+， - ，*，/ 四种运算符和空格 。 整数除法仅保留整数部分。 
//
// 示例 1： 
//
// 
//输入："3+2*2"
//输出：7
// 
//
// 示例 2： 
//
// 
//输入：" 3/2 "
//输出：1 
//
// 示例 3： 
//
// 
//输入：" 3+5 / 2 "
//输出：5
// 
//
// 说明： 
//
// 
// 你可以假设所给定的表达式都是有效的。 
// 请不要使用内置的库函数 eval。 
// 
//
// Related Topics 栈 数学 字符串 👍 113 👎 0


package LeetCode.editor.cn;


import java.util.ArrayDeque;
import java.util.Deque;

/**
 * @author ldltd
 * @date 2025-09-11 21:37:40
 * @description 面试题 16.26.计算器
 
 */
 
public class CalculatorLcci {
    public static void main(String[] args) {
    //测试代码
    CalculatorLcci fun = new CalculatorLcci();
    Solution solution= fun.new Solution();
    
    }

//leetcode submit region begin(Prohibit modification and deletion)
class Solution {
        /*
遍历字符串：逐个字符处理。
数字处理：遇到数字字符时，累积成整数 num。
运算符或字符串末尾处理：
当遇到非数字且非空格的字符（即运算符），
或者到达字符串末尾时，根据前一个运算符 sign 来决定如何操作栈。
处理完后，更新当前运算符 sign 为当前字符，并重置 num 为0。
最终计算：将栈中所有数字相加得到结果。
        * */
    public int calculate(String s) {
        Deque<Integer> stack = new ArrayDeque<>();
        int num = 0;
        // 初始化符号为'+' ，表示前一个操作
        char sign = '+';
        for (int i = 0; i < s.length(); i++) {
            char c = s.charAt(i);
            // 处理数字，累积成整数
            if (Character.isDigit(c)) {
                num = num * 10 + (c - '0');
            }
            // 遇到运算符或者到达字符串末尾
            if ((!Character.isDigit(c) && c != ' ') || i == s.length() - 1) {
                // 根据前一个符号进行操作
                switch (sign) {
                    case '+':
                        stack.push(num);
                        break;
                    case '-':
                        stack.push(-num);
                        break;
                    case '*':
                        stack.push(stack.pop() * num);
                        break;
                    case '/':
                        int prev = stack.pop();
                        stack.push(prev / num);
                        break;
                }
                sign = c;
                num = 0;
            }
        }
        int result = 0;
        while (!stack.isEmpty()) {
            result += stack.pop();
        }
        return result;
    }
}
//leetcode submit region end(Prohibit modification and deletion)

}
